package Clases;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import frsf.cidisi.exercise.arqueologic.situationCalculus.ArqueologicAgentPerception;

public class Mundo {
	private int [][] distancias = {{0,100,-1,-1,-1,-1,150,-1,-1,-1,-1},
								  {100,0,180,-1,200,-1,-1,-1,-1,-1,-1},
								  {-1,180,0,450,-1,-1,-1,-1,-1,-1,-1},
								  {-1,-1,450,0,-1,100,400,200,300,-1,-1},
								  {-1,200,-1,-1,0,350,-1,-1,-1,-1,-1},
								  {-1,-1,-1,100,350,0,-1,-1,-1,-1,-1},
								  {150,-1,-1,400,-1,-1,0,-1,-1,-1,-1},
								  {-1,-1,-1,200,-1,-1,-1,0,-1,-1,-1},
								  {-1,-1,-1,300,-1,-1,-1,-1,0,200,-1},
								  {-1,-1,-1,-1,-1,-1,-1,-1,200,0,200},
								  {-1,-1,-1,-1,-1,-1,-1,-1,-1,200,0}};
	private ArrayList<Aldea> aldeas;
	private int tesoroRemanente;
	
	public Mundo() {
		super();
		this.aldeas = new ArrayList<Aldea>();
		this.setAldeas();
		this.setDistancias(distancias);
	}
	@Override
	public Object clone(){
		Mundo m = new Mundo();
		ArrayList<Aldea> a = new ArrayList<Aldea>();
		for (Aldea aldea : aldeas) {
			a.add((Aldea) aldea.clone());
		}
		m.setDistancias(distancias);
		m.aldeas=a;
		return m;
	}
	public int[][] getDistancias() {
		return distancias;
	}
	public void setDistancias(int[][] distancias) {
		this.distancias = distancias;
	}
	public void setAldeas(){
		Aldea a1 = new Aldea();
		Aldea a2 = new Aldea();
		Aldea a3 = new Aldea();
		Aldea a4 = new Aldea();
		Aldea a5 = new Aldea();
		Aldea a6 = new Aldea();
		Aldea a7 = new Aldea();
		Aldea a8 = new Aldea();
		Aldea a9 = new Aldea();
		Aldea a10 = new Aldea();
		Aldea a11 = new Aldea();
		Cofre c1 = new Cofre();
		Cofre c2 = new Cofre();
		Cofre c3 = new Cofre();
		Cofre c4 = new Cofre();
		Cofre c5 = new Cofre();
		Cofre c6 = new Cofre();
		Cofre c7 = new Cofre();
		Cofre c8 = new Cofre();
		Cofre c9 = new Cofre();
		Cofre c10 = new Cofre();
		Cofre c11 = new Cofre();
		
		//Situacion 1...
		int[] cant = new int[]{100,20,80,300,550};
		//Situacion 2...
//		int[] cant = new int[]{500,200,150,500,400};
		c1.setCantidad(cant);
		a1.setNombre(Aldea.ARAGAEY);
		a1.setCofre(c1);
		c1.actualizarCofre();
		a1.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a1);
		
		//Situacion 1...
		cant = new int[]{300,400,280,80,150};
		//Situacion 2...
//		cant = new int[]{300,400,50,100,80};
		c3.setCantidad(cant);
		a3.setNombre(Aldea.ERGINTONE);
		a3.setCofre(c3);
		c3.actualizarCofre();
		a3.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a3);
		
		//Situacion 1...
		cant = new int[]{100,400,500,450,500};
		//Situacion 2...
//		cant = new int[]{200,150,200,300,400};
		c2.setCantidad(cant);
		a2.setNombre(Aldea.PEREGAEY);
		a2.setCofre(c2);
		c2.actualizarCofre();
		a2.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a2);		
		
		//Situacion 1...
		cant = new int[]{50,150,200,50,150};
		//Situacion 2...
//		cant = new int[]{500,200,150,300,250};
		c4.setCantidad(cant);
		a4.setNombre(Aldea.VINIZAILE);
		a4.setCofre(c4);
		c4.actualizarCofre();
		a4.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a4);
		
		//Situacion 1...
		cant = new int[]{250,120,20,150,300};
		//Situacion 2...
//		cant = new int[]{150,350,100,100,250};
		c5.setCantidad(cant);
		a5.setNombre(Aldea.BULOVOE);
		a5.setCofre(c5);
		c5.actualizarCofre();
		a5.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a5);
		
		//Situacion 1...
		cant = new int[]{400,200,300,400,250};
		//Situacion 2...
//		cant = new int[]{50,150,300,80,150};
		c6.setCantidad(cant);
		a6.setNombre(Aldea.ICAEDUR);
		a6.setCofre(c6);
		c6.actualizarCofre();
		a6.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a6);
		
		//Situacion 1...
		cant = new int[]{80,80,70,20,200};
		//Situacion 2...
//		cant = new int[]{400,500,250,300,550};
		c7.setCantidad(cant);
		a7.setNombre(Aldea.BRESOL);
		a7.setCofre(c7);
		c7.actualizarCofre();
		a7.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a7);
		
		//Situacion 1...
		cant = new int[]{160,250,170,60,120};
		//Situacion 2...
//		cant = new int[]{250,150,350,400,350};
		c8.setCantidad(cant);
		a8.setNombre(Aldea.CABE);
		a8.setCofre(c8);
		c8.actualizarCofre();
		a8.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a8);
		
		//Situacion 1...
		cant = new int[]{350,350,240,150,350};
		//Situacion 2...
//		cant = new int[]{50,400,300,500,250};
		c9.setCantidad(cant);
		a9.setNombre(Aldea.MIXOCU);
		a9.setCofre(c9);
		c9.actualizarCofre();
		a9.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a9);
		
		//Situacion 1...
		cant = new int[]{20,50,70,100,60};
		//Situacion 2...
//		cant = new int[]{300,400,500,200,150};
		c10.setCantidad(cant);
		a10.setNombre(Aldea.ASE);
		a10.setCofre(c10);
		c10.actualizarCofre();
		a10.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a10);
		
		//Situacion 1...
		cant = new int[]{220,300,130,400,280};
		//Situacion 2...
//		cant = new int[]{100,300,400,400,400};
		c11.setCantidad(cant);
		a11.setNombre(Aldea.CENEDE);
		a11.setCofre(c11);
		c11.actualizarCofre();
		a11.setPercepcion(ArqueologicAgentPerception.COFRE_LLENO);
		aldeas.add(a11);
		
		this.tesoroRemanente = this.calcularTesoroTotal();
	}
	public ArrayList<String> getNombres() {
		ArrayList<String> nombres = new ArrayList<String>();
		Iterator<Aldea> it = aldeas.iterator();
		while(it.hasNext()){
			nombres.add(it.next().getNombre());
		}
		return nombres;
	}
	public Cofre getCofre(String aldea){
		Cofre co = new Cofre();
		int i = 0;
		
		while(i < 11 && aldeas.get(i).getNombre() != aldea){
			i++;			
		}
		co = aldeas.get(i).getCofre();	
		return co;
	}
	public Aldea getAldea(String nombre){
		int i=0;
		
		while(i <11 && aldeas.get(i).getNombre() != nombre){
			i++;
		}
		
		return aldeas.get(i);
	}
	public int[][] distanciasMinimas(){
		int [][] distMin = {{0,100,-1,-1,-1,-1,150,-1,-1,-1,-1},
						  {100,0,180,-1,200,-1,-1,-1,-1,-1,-1},
						  {-1,180,0,450,-1,-1,-1,-1,-1,-1,-1},
						  {-1,-1,450,0,-1,100,400,200,300,-1,-1},
						  {-1,200,-1,-1,0,350,-1,-1,-1,-1,-1},
						  {-1,-1,-1,100,350,0,-1,-1,-1,-1,-1},
						  {150,-1,-1,400,-1,-1,0,-1,-1,-1,-1},
						  {-1,-1,-1,200,-1,-1,-1,0,-1,-1,-1},
						  {-1,-1,-1,300,-1,-1,-1,-1,0,200,-1},
						  {-1,-1,-1,-1,-1,-1,-1,-1,200,0,200},
						  {-1,-1,-1,-1,-1,-1,-1,-1,-1,200,0}};
	
		for(int i = 0; i < 11; i++)
			for(int j = 0; j < 11; j++)
				for(int k = 0; k < 11; k++)
					if((distMin[j][i] > -1) && (distMin[i][k] > -1)){
						if(distMin[j][k] > -1){
							distMin[j][k] = Math.min(distMin[j][k], distMin[j][i] + distMin[i][k]);
						}else{
							distMin[j][k] = distMin[j][i] + distMin[i][k];
						}		
					}		
		return distMin;
	}
	private int calcularTesoroTotal() {
		int teTotal = 0;
		
		for(int i = 0; i < 11; i++)
			teTotal += this.getCofre(this.aldeas.get(i).getNombre()).getValor();
		
		return teTotal;
	}
	public int getTesoroRemanente() {
		return this.tesoroRemanente;
	}
	public void restarTesoro(String al){
		this.tesoroRemanente -= this.getCofre(al).getValor(); 
	}
	public Collection<String> getVecinos(String aldea) {
		ArrayList<String> vec = new ArrayList<String>();
		int indice = this.getNombres().indexOf(aldea);
		int dist[][] = this.getDistancias();
		
		for(int i = 0; i < 11; i++){
			if(dist[indice][i] > 0){
				vec.add(this.getNombres().get(i));
			}
		}
		return vec;
	}
}
